/**
 * 
 */
package pruebas.VerduleriaOl.riuCliente;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.inject.Inject;
import javax.inject.Named;

import pruebas.VerduleriaOl.dominio.entidades.TipoArticulo;
import pruebas.VerduleriaOl.dominio.incrustables.ItemCarrito;
import pruebas.VerduleriaOl.dominio.servicio.PsCarrito;

import com.intelap.fabricaciones.ConocedorUnidadTrabajoActual;
import com.intelap.fabricaciones.UnidadTrabajo;
import com.intelap.jsfLib.ayudaDaosJava.AyudaDaoBusqueda_Java;
import com.intelap.jsfLib.decoracion.DaoBusqueda;
import com.intelap.jsfLib.decoracion.DciBuscador.MdcBuscadorPi;
import com.intelap.jsfLib.decoracion.DciCampo.DcaCampo;
import com.intelap.pureFabrications.AccesoPropMutableObservable;
import com.intelap.pureFabrications.AccesoPropMutableObservable.AccesoPropMutableObservableImpl;

/** @author ggpollit */
@Named
@ConversationScoped
public class RiuCarrito implements Serializable {
	@Inject
	private Logger logger;

	@Inject
	private Conversation conversacion;
	@Inject
	private UnidadTrabajo unidadTrabajo;
	@Inject
	private PsCarrito psCarrito;

	@PostConstruct
	void inicializar() {
		conversacion.begin();
		logger.info("Conversacion " + conversacion.getId() + " abierta por RiuCarrito.");
	}

	//////////////////////

	private MdcBuscadorItemCarrito mdcBuscadorItemCarrito = null;
	public MdcBuscadorItemCarrito getMdcBuscadorItemCarrito() {
		if (this.mdcBuscadorItemCarrito == null) {
			this.mdcBuscadorItemCarrito = new MdcBuscadorItemCarrito(this.accesoItemCarritoElegido);
		}
		return this.mdcBuscadorItemCarrito;
	}

	private final AccesoPropMutableObservable<Entry<TipoArticulo, ItemCarrito>> accesoItemCarritoElegido = new AccesoPropMutableObservableImpl<>(null);

	private class MdcBuscadorItemCarrito extends MdcBuscadorPi<Entry<TipoArticulo, ItemCarrito>, ItemCarritoAdaptado> {
		public MdcBuscadorItemCarrito(AccesoPropMutableObservable<Entry<TipoArticulo, ItemCarrito>> acceso) {
			super(acceso, null);
		}

		@Override
		public String getEncabezadoTabla() {
			return "Carrito";
		}

		@Override
		protected Class<ItemCarritoAdaptado> getTipoElemsAdaptados() {
			return ItemCarritoAdaptado.class;
		}

		@Override
		protected Entry<TipoArticulo, ItemCarrito> getRespaldo(ItemCarritoAdaptado elementoAdaptado) {
			return elementoAdaptado.respaldo;
		}

		@Override
		protected DaoBusqueda<ItemCarritoAdaptado> getDaoBusqueda() {
			return this.daoBusquedaItemCarrito;
		}
		private final DaoBusqueda<ItemCarritoAdaptado> daoBusquedaItemCarrito = new AyudaDaoBusqueda_Java<Entry<TipoArticulo, ItemCarrito>, ItemCarritoAdaptado>() {
			@Override
			protected List<Entry<TipoArticulo, ItemCarrito>> getElementos() {
				return new ArrayList<Entry<TipoArticulo, ItemCarrito>>(psCarrito.getItems());
			}
			@Override
			protected Class<ItemCarritoAdaptado> getTipoElems() {
				return getTipoElemsAdaptados();
			}
			@Override
			protected ItemCarritoAdaptado adaptar(Entry<TipoArticulo, ItemCarrito> elementoGenuino) {
				return new ItemCarritoAdaptado(elementoGenuino);
			}
		};
	}

	public static class ItemCarritoAdaptado {
		final Entry<TipoArticulo, ItemCarrito> respaldo;
		ItemCarritoAdaptado(Entry<TipoArticulo, ItemCarrito> ic) {
			this.respaldo = ic;
		}
		@DcaCampo
		public String getNombreArticulo() {
			return respaldo.getKey().getNombre();
		}
		@DcaCampo
		public int getCantidad() {
			return respaldo.getValue().getCantidad();
		}
	}

	/////////////////////

	public void botonBorrarHaSidoPresionado() {
		if (this.accesoItemCarritoElegido.getValor() == null)
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Antes debe elegir un artículo"));
		else {
			this.psCarrito.sacarItems(this.accesoItemCarritoElegido.getValor().getKey(), Integer.MAX_VALUE);
			this.accesoItemCarritoElegido.setValor(null);
			this.getMdcBuscadorItemCarrito().datosAsistenciaHanCambiado();
		}
	}

	//////////////////////

	public PhaseListener getPhaseListener() {
		return new PhaseListener() {
			@Override
			public PhaseId getPhaseId() {
				return PhaseId.ANY_PHASE;
			}
			@Override
			public void beforePhase(PhaseEvent event) {
				ConocedorUnidadTrabajoActual.setActual(unidadTrabajo);
			}
			@Override
			public void afterPhase(PhaseEvent event) {
				ConocedorUnidadTrabajoActual.setActual(unidadTrabajo);
			}
		};
	}
}
